package org.japo.java.entities;

import java.util.Calendar;
import java.util.GregorianCalendar;

public class Hora {

    // Variables
    private int h;
    private int m;
    private int s;

    // Constructor predeterminado
    public Hora() {
        establecerHoraSistema();
    }

    // Constructor parametrizado
    public Hora(int h, int m, int s) {
        if (validarHora(h, m, s)) {
            this.h = h;
            this.m = m;
            this.s = s;
        } else {
            establecerHoraSistema();
        }
    }

    // --- Inicio encapsulación
    //
    public int getH() {
        return h;
    }

    public void setH(int h) {
        if (h >= 0 && h <= 23) {
            this.h = h;
        }
    }

    public int getM() {
        return m;
    }

    public void setM(int m) {
        if (m >= 0 && m <= 59) {
            this.m = m;
        }
    }

    public int getS() {
        return s;
    }

    public void setS(int s) {
        if (s >= 0 && s <= 59) {
            this.s = s;
        }
    }

    // --- Fin encapsulación
    //
    public static boolean validarHora(int h, int m, int s) {
        return h >= 0 && h <= 23 &&
                m >= 0 && m <= 59 &&
                s >= 0 && s <= 59;
    }

    public void mostrarHora() {
        System.out.println(toString());
    }

    private void establecerHoraSistema() {
        // Instancia objeto GregorianCalendar
        GregorianCalendar gc = new GregorianCalendar();

        // Obtener la hora
        h = gc.get(Calendar.HOUR_OF_DAY);
        m = gc.get(Calendar.MINUTE);
        s = gc.get(Calendar.SECOND);
    }

    // --- Inicio de sobrecarga de métodos
    //
    @Override
    public boolean equals(Object o) {
        // Semaforo de resultado
        boolean testOK;

        // Análisis del objeto
        if (o == null) {
            testOK = false;
        } else if (!(o instanceof Hora)) {
            testOK = false;
        } else {
            Hora hora = (Hora) o;
            testOK = this.h == hora.h &&
                    this.m == hora.m &&
                    this.s == hora.s;
        }

        // Devolución del resultado
        return testOK;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 79 * hash + this.h;
        hash = 79 * hash + this.m;
        hash = 79 * hash + this.s;
        return hash;
    }

    @Override
    public String toString() {
        return String.format("%02d:%02d:%02d", h, m, s);
    }

}
